/******************************************************************************
*@file     ec_cmd.c
*@brief    ESP32-IDF 控制台添加自定义指令
*@author   zhjh
*@version  1.0
*@date     2023年12月17日
*
*@copyright  Copyright (c) 2023 天津柯迪斯科极有限公司 All rights reserved.
*
*@par 修改日志:
*<table>
*<tr><th>Date       <th>Version   <th>Author      <th>Description
*<tr><td>2023年12月17日<td>【版本号】     <td>【作者】     <td>【日志】
*</table>
*系统指令：
*    free                    ：查看剩余内存
*    heap                    ：查看最小剩余
*    version                 ：查看芯片和SDK的版本
*
*NVS命令使用该说明：
*   
*    nvs_list <partition>                   ：列出分区的所有的键值及其数据类型，上位机可以使用这个方法读取参数
*    nvs_list <partition> -n <namespace>    : 列出分区中特定命名空间中的所有的键值及其数据类型，
*    nvs_list <partition> -t <type>         ：列出分区中特定数据类型中的所有的键值及其数据类型，可与上条指令组合使用
*    nvs_namespace <namespace>              ：读取键值之前，需要切换命名空间，以下命令是在相应的命名空间中进行的。
*        nvs_get <key> <type>               ：读取键值为“PARAMETER”的所有数据，
*        nvs_erase  <key>                   ：擦除键值    type can be: i8, u8, i16, u16 i32, u32 i64, u64, str, blob
*        nvs_set  <key> <type> -v <value>   ：设置的值
*        nvs_erase_namespace  <namespace>   ：擦除某个命名空间
*自定义指令
*    get_voltage                            ：获得电池采样电压值
*    set_position 1 1                       ：设置LCD屏上某段亮，set lcd p 0~160  0/1，0~160是地址，0/1：是否显示，便于查找数据地址
*    set_seg 1 1                            ：设置LCD屏上数码管显示数字，set lcd seg 0~15  0~10，0~15个数码管，10为不显示
*    set_speed 1 99 1                       ：设置速度或者百分比set speed 1/2/3/4（1是主速度，2：导航速度3：电量百分比:4：电量格（0~5）） 0~999 0/1
******************************************************************************/
#include "config.h"
#include "ec_bsp.h"
#include "ec_app.h"
#include "esp_system.h"
#include "esp_partition.h"
#include "esp_ota_ops.h"
#include "esp_console.h"
extern void exces_bsp_lcd_setbit(uint16_t position,uint8_t state);
extern void exces_bsp_lcd_bit_filp(uint16_t position);//用闪缩
extern void exces_bsp_lcd_set_seg(uint8_t index,uint32_t data);
extern void exces_app_disp_speed(uint16_t speed, uint8_t state);//
extern void exces_app_disp_navi_speed(uint16_t speed, uint8_t state);//
extern void exces_app_disp_soc_percentage(uint16_t perc,uint8_t state);//显示电池百分比
extern void exces_app_disp_soc_bar(uint8_t bar,uint8_t state);//显示电量格
extern void exces_app_disp_gear(uint8_t gear,uint8_t frame);//输入0~5,0xFF（助推挡），frame：闪锁框

extern int8_t exces_app_get_dic_value(uint8_t enum_value);
static int exces_cmd_get_voltage(int argc, char **argv)
{
    int voltage = 0;
    if (argc == 2) {
        voltage = exces_bsp_adc_read(atoi(argv[1]));
        printf("voltage: %dmV\n", voltage);
    }
    return 0;
}
/******************************************************************************
*@brief    单独设置LCD屏上某个图标
*@param[in/out] argc 【参数注释】
*@param[in/out] argv 【参数注释】
*@return int         【返回值注释】
*
*@warning  【不可重入,阻塞等警告】
*@note     【重大修改】
******************************************************************************/
static int exces_cmd_set_lcd_position(int argc, char **argv)
{
    if (argc == 3) {
        exces_bsp_lcd_setbit(atoi(argv[1]),atoi(argv[2]));
    }
    exces_bsp_lcd_refresh();
    return 0;
}
static int exces_cmd_set_lcd_position_filp(int argc, char **argv)
{
    if (argc == 2) {
        exces_bsp_lcd_bit_filp(atoi(argv[1]));
    }
    exces_bsp_lcd_refresh();
    return 0;
}
static int exces_cmd_set_lcd_seg(int argc, char **argv)
{
    if (argc == 3) {
        exces_bsp_lcd_set_seg(atoi(argv[1]),atoi(argv[2]));
    }
    exces_bsp_lcd_refresh();
    return 0;
}
static int exces_cmd_get_dic(int argc, char **argv)
{
    if (argc == 2) {
        exces_app_get_dic_value(atoi(argv[1]));
    }
    return 0;
}
static int exces_cmd_set_disp(int argc, char **argv)
{
    if (argc == 4) {
        if(atoi(argv[1]) == 1)exces_app_disp_speed(atoi(argv[2]),atoi(argv[3]));//显示速度
        else if(atoi(argv[1]) == 2)exces_app_disp_navi_speed(atoi(argv[2]),atoi(argv[3]));//显示导航速度
        else if(atoi(argv[1]) == 3)exces_app_disp_soc_percentage(atoi(argv[2]),atoi(argv[3]));//显示电量百分比
        else if(atoi(argv[1]) == 4)exces_app_disp_soc_bar(atoi(argv[2]),atoi(argv[3]));//显示电量百分比
        else if(atoi(argv[1]) == 5)exces_app_disp_gear(atoi(argv[2]),atoi(argv[3]));//显示档位
    }
    exces_bsp_lcd_refresh();
    return 0;
}
void register_custom_commands(void)
{
    esp_console_cmd_t cmd_1 = {
        .command = "get_voltage",               // 命令名称
        .help = "get bat voltage",              // 命令帮助信息
        .hint = "0/1",                          // 命令参数提示
        .func = exces_cmd_get_voltage           // 命令处理函数
    };      
    esp_console_cmd_register(&cmd_1);
    esp_console_cmd_t cmd_2 = {
        .command = "set_position",          // 命令名称
        .help = "set lcd p 0~160  0/1",    // 命令帮助信息
        .hint = "0~200  0/1",                    // 命令参数提示
        .func = exces_cmd_set_lcd_position       // 命令处理函数
    };
    esp_console_cmd_register(&cmd_2);
    esp_console_cmd_t cmd_3 = {
        .command = "set_pos_to",          // 命令名称
        .help = "set lcd p 0~160",    // 命令帮助信息
        .hint = "0~200",                    // 命令参数提示
        .func = exces_cmd_set_lcd_position_filp       // 命令处理函数
    };
    esp_console_cmd_register(&cmd_3);
    esp_console_cmd_t cmd_4 = {
        .command = "set_seg",          // 命令名称
        .help = "set lcd seg 0~15  0~10",    // 命令帮助信息
        .hint = "0~15  0~10",                    // 命令参数提示
        .func = exces_cmd_set_lcd_seg       // 命令处理函数
    };
    esp_console_cmd_register(&cmd_4);
    esp_console_cmd_t cmd_5 = {
        .command = "set_disp",          // 命令名称
        .help = "set disp 1/2/3/4/5 0~999 0/1",    // 命令帮助信息
        .hint = "1/2/3/4/5 0~999 0/1",                    // 命令参数提示
        .func = exces_cmd_set_disp       // 命令处理函数
    };
    esp_console_cmd_register(&cmd_5);

    esp_console_cmd_t cmd_6 = {
        .command = "get_dic",          // 命令名称
        .help = "set disp 1/2/3/4/5 0~999 0/1",    // 命令帮助信息
        .hint = "1/2/3/4/5 0~999 0/1",                    // 命令参数提示
        .func = exces_cmd_get_dic       // 命令处理函数
    };
    esp_console_cmd_register(&cmd_6);
}


